//
// Created by QU on 24-6-12.
//
#include <iostream>
#include <string>
#include <regex>



/**
 * 在 C++ 的正则表达式库中，匹配操作（如 std::regex_search 或 std::regex_match）是一种一次性操作。
 * 具体来说，当你调用这些匹配函数时，库会立即执行匹配，并返回一个包含所有匹配结果的对象，比如 std::smatch。
 * 匹配结果是一次性完成的，这意味着所有相关信息（包括匹配的前缀、后缀、子匹配等）都已经在调用匹配函数时计算并存储在 std::smatch 对象中。
 */
int main() {
//    std::string text = "Here are some emails: john.doe@example.com, jane.smith@company.org, info@website.net";
//    std::regex email_pattern(R"(([[:alnum:].-]+)@([[:alnum:].-]+)\.([[:alpha:].]+))");
//
//    std::smatch match;
//    std::regex_search(text, match, email_pattern);
//
//    if (match.ready() && !match.empty()) {
//        std::cout << "Match: " << match.str() << std::endl;
//
//        std::ssub_match prefix = match.prefix();
//        std::ssub_match suffix = match.suffix();
//
//        std::cout << "Prefix: \"" << prefix.str() << "\"" << std::endl;
//        std::cout << "Suffix: \"" << suffix.str() << "\"" << std::endl;
//
//        for (size_t i = 0; i < match.size(); ++i) {
//            std::ssub_match sub = match[i];
//            std::cout << "Sub-match " << i << ": " << sub.str() << std::endl;
//        }
//    } else {
//        std::cout << "No match found or match object not ready." << std::endl;
//    }


/**
 * sergex_iterator最中调用了regex_search, regex_search有一个smatch参数用来返回结果,
 * 如果我直接调用regex_search函数, 我需要自己提供smatch, 如果通过iterator的方式, 这个smatch的结果在iterator内部, 我可以这样理解吗
 *
 *
 *  是的，你的理解是正确的。
 *  当你直接调用 std::regex_search 函数时，你需要自己提供一个 std::smatch 对象来存储匹配的结果。
 *  而当你使用 std::sregex_iterator 迭代器方式时，匹配结果是在迭代器内部被存储的，你无需自己提供 std::smatch 对象，而是通过迭代器来访问这些匹配结果。

 *  简而言之：
 *  直接调用 std::regex_search：你需要自己提供 std::smatch 对象来存储匹配结果。
 *  使用 std::sregex_iterator 迭代器：匹配结果是在迭代器内部存储的，你通过迭代器来访问这些匹配结果，无需自己提供 std::smatch 对象。
 *  这种方式让使用更加方便，因为你不需要手动创建和管理 std::smatch 对象，而是直接通过迭代器访问匹配结果。

 *  在你的理解中，迭代器内部存储了匹配结果，这是正确的。
 *  std::sregex_iterator 在每次迭代时会调用 std::regex_search，并将匹配结果存储在内部以供后续访问。
 */

// 使用regex子表达式
    std::regex regex(R"(([[:alnum:]]+)\.(cpp|cxx|cc)$)", std::regex::icase);

    std::string filenames[] = {
            "example.cpp",
            "test.cxx",
            "myfile.cc",
            "another_file.CPP",
            "wrongfile.txt"
    };

    for (const auto& filename : filenames) {
        std::smatch match;
        // 如果是match, 判定方式为全部内容,    search表示的匹配部分内容.
        // 举个例子, 在上面的数组中存在一个another_file.CPP,
        // 如果是match,another_file.CPP不行, search就可以(但是匹配的内容是file.CPP, 而不是another_file.CPP)
        if (std::regex_match(filename, match, regex)) {
//        if (std::regex_search(filename, match, regex)) {
//            std::cout << "Matched: " << filename << std::endl;
            // [0]为表达式本身smatch, [1], [2], [3]...... 为各个子表达式ssub_match.
            std::cout << "Matched: " << match[0].str() << std::endl;
            std::cout << "File name: " << match[1].str() << std::endl;
            std::cout << "Extension: " << match[2].str() << std::endl;
        } else {
            std::cout << "Did not match: " << filename << std::endl;
        }
    }


    return 0;
}

